package 多线程.Threadpool;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 线程池如何关闭？
 * 线程池关闭，可以使用 shutdown() 或 shutdownNow() 方法，它们的区别是：
 *
 * shutdown()：不会立即终止线程池，而是要等所有任务队列中的任务都执行完后才会终止。
 * 执行完 shutdown 方法之后，线程池就不会再接受新任务了。
 *
 * shutdownNow()：执行该方法，线程池的状态立刻变成 STOP 状态，并试图停止所有正在执行的线程，
 * 不再处理还在池队列中等待的任务，执行此方法会返回未执行的任务。
 */
public class ThreadPoolExecutorAllArgsTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //创建线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1,
                10L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2),
                new MyThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        //提交任务
        threadPoolExecutor.execute(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println("提交任务" + i);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    System.out.println(e.getMessage());
                }
            }
        });
        System.out.println("已经启用好全部线程，准备shutdown");
        threadPoolExecutor.shutdown();
        //再次提及任务
        threadPoolExecutor.execute(() -> {
            System.out.println("我想再次提及任务");
        });
    }
}